package com.example.behaviorpattern.memento.whitebox;

/**
 * 白箱备忘录测试类
 * 白箱备忘录模式通常使用在需要保存一个对象在某一时刻状态的场景中。
 * 当我们希望在不破坏封装性的情况下，捕获并保存对象的内部状态，以便在后续可以将其恢复到这一状态时，通常会使用白箱备忘录模式。
 * 使用场景通常包括：
 * 需要提供一个撤销操作时，保存操作前的状态，以便能够回退。
 * 当对象的状态需要保存，而这个状态对于其他对象来说是不可见，或不应该是可见的。
 * 当需要保存的状态较多、或者对象间互相不信任时，需要确保对象状态的完整性和一致性。
 * 所需组件：
 * Originator（原发器）：对象，其状态需要保存。
 * Memento（备忘录）：用来存储原发器状态的对象。
 * Caretaker（负责人）：负责保存备忘录对象，但不能修改或查看备忘录的内容。
 *
 * @author yaojianfeng
 */
public class WhiteBoxMementoTest {
    public static void main(String[] args) {
        // 创建原发器
        Originator originator = new Originator();
        // 创建负责人
        Caretaker caretaker = new Caretaker();

        // 原发器设置状态为"State1"
        originator.setState("State1");
        System.out.println("初始状态:" + originator.getState());

        // 保存状态时，由原发器生成一个备忘录对象，并将其交给负责人保存
        caretaker.setMemento(originator.createMemento());
        // 改变原发器状态
        originator.setState("State2");
        System.out.println("第一次设置后的状态:" + originator.getState());

        // 从负责人处获取备忘录对象，恢复原发器的状态
        originator.rollbackNextMemento(caretaker.getMemento());
        System.out.println("恢复初始状态:" + originator.getState());

        originator.setState("State3");
        System.out.println("第二次设置的状态:" + originator.getState());
        caretaker.setMemento(originator.createMemento());

        originator.setState("State4");
        System.out.println("第三次设置的状态:" + originator.getState());

        // 从负责人处获取备忘录对象，恢复原发器的状态
        originator.rollbackNextMemento(caretaker.getMemento());
        System.out.println("恢复第二次设置的状态:" + originator.getState());

    }
}
